#include <iostream>
#include <vector>
#include <memory>
using namespace std;
struct node{
	int ele;
	shared_ptr<node> next;
	node(int x = 0):ele(x){}
	~node(){
		cout << "node is not exisit anymore" << endl;
	}
};
/*
Blob是一个管理 vector<string> 字符串数组的类，
使用这个类的目的是想让多个对象共享一片数据 vector<string> data;
同时也保证不会因为一个对象的销毁而导致该区域的内容不可访问。
同时如果改变量使用static则全体成员都可以访问。
所以 使用shared_ptr<vector<string> > data;这样的动态内存管理方式，
可以使得数据具有一定的私密性 且容易共享
*/
class StrBlob{
public:
	typedef std::vector<std::string>::size_type size_type;
	StrBlob(); //默认构造函数
	StrBlob(std::initializer_list<std::string> il);
	size_type size() const{
		return data->size();
	} 
    bool empty() const {
        return data->empty();
    }
    void push_back(const string& rhs){
        data->push_back(rhs);
    }
    void pop_back(){
        data->pop_back();
    }
    string& front();
    string& back();
    string front() const{
        check(0,"");
        return data->front();
    }
    string back() const{
        return data->back();
    }
private:
	shared_ptr<vector<string>> data;
	void check(size_type i , const std::string &msg) const;
};

StrBlob::StrBlob():data(make_shared<vector<string>>()){}
StrBlob::StrBlob(initializer_list<string> il):data(make_shared<vector<string>>(il)){} //参数列表只能给make_shared<>()来创建
void StrBlob::check(size_type i , const string &msg) const{ //msg表示出错报错信息
    if(i >= data->size())
        throw out_of_range(msg);//抛出异常
}
string& StrBlob::back(){
    check(0,"back on empty StrBlob");
    return data->back(); //成员 
}
string& StrBlob::front(){
    return data->front();
}

int main(){
	shared_ptr<node> pnode = make_shared<node>(56);
	shared_ptr<node> tnode(pnode) ;
	
	// test 1 
//	delete pnode;  错误 智能指针对象不能被质检删除 
	///test 2 
//	delete pnode.get(); 可以执行 但是pnode对象并未被销毁 也就意味着在程序结束之后 pnode会再次调用析构函数并删除所指向的内存 这个时候就会出错
//	被智能指针管理的内存空间只能有智能指针删除，计数也只能够通过赋值来增加或者减少 并不能通过删除的手段 
	
//	shared_ptr<Blob> p1(new Blob());
//	shared_ptr<Blob> p2(p1);
//	
//	cout << p1->vec[0] << endl;
//	
//	delete &p1;
//	cout << p2->vec[0] << endl;
	
	return 0;
} 